package com.edu.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import javax.servlet.http.HttpServletRequest;
import java.io.PrintWriter;
import java.io.StringWriter;

/*
 * @Author:princess
 * @Date 2023/12/6 12 06 19:18
 * 全局异常处理
 */
@ControllerAdvice
public class ExceptionHandlerController {
    /*
        统一异常处理 既能处理同步请求(SpringMVC+jsp 进行页面跳转)
        也能处理 异步请求 的异常
            1.需要先判断请求的类型 是不是异步请求
            2.异步请求 返回错误代码 错误消息（不要返回一个完整的代码页面）
            3.同步请求 设置错误页面试图 可以选择返回 错误的异常堆栈信息 记录日志等。
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handlerException(Exception e, HttpServletRequest request){
        ModelAndView mv = new ModelAndView();//做页面跳转的modelAndView 同步请求负责页面跳转和显示错误信息
        //如果判断成立，说明请求是异步请求，不再做页面跳转 只返回数据
        if (request.getHeader("X-Requested-With") != null){
            //new ModelAndView(new MappingJackson2JsonView())会把mv中的数据 以JSON格式返回给前端不在进行跳转
            mv = new ModelAndView(new MappingJackson2JsonView());
            //根据异常的类型 去放置不同的错误代码 错误信息
            mv.addObject("code","500");
            mv.addObject("msg","出错啦");
            return mv;
        }
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        //获得完整异常信息的字符串
        System.out.println(sw.toString());//项目中换成logger
        //调到错误页面并附带错误信息
        mv.addObject("error",sw.toString());
        mv.setViewName("error");
        return mv;
    }
}
